<!DOCTYPE HTML>
<html>
<head>
<title>ControlSend[Raw] | AutoHotkey</title>
<meta name="description" content="The ControlSend and ControlSendRaw commands send simulated keystrokes to a window or control." />
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<link href="../static/theme.css" rel="stylesheet" type="text/css" />
<script src="../static/content.js" type="text/javascript"></script>
</head>
<body>

<h1>ControlSend[Raw]</h1>

<p>发送模拟键击到窗口或控件.</p>

<pre class="Syntax">
<span class="func">ControlSend</span> <span class="optional">, Control, Keys, WinTitle, WinText, ExcludeTitle, ExcludeText</span>
ControlSendRaw: 参数同上.
</pre>
<h2>参数</h2>
<dl>

  <dt>Control</dt>
  <dd><p>可以是 ClassNN(控件的类名和实例编号) 或控件的文本, 它们都可以通过 Window Spy 获取. 使用文本时, 匹配行为由 <a href="SetTitleMatchMode.htm">SetTitleMatchMode</a> 决定. 如果此参数为空或省略, 则使用目标窗口的顶层控件. 如果此参数为 <code>ahk_parent</code>, 则直接发送键击到目标窗口而非其中的某个控件(请参阅<a href="../misc/Winamp.htm">自动化 Winamp</a> 中的例子).</p>
    <p>要对控件的 HWND(窗口句柄) 进行操作, 请将 <em>Control</em> 参数留空同时在 <em>WinTitle</em> 参数中指定 <code>ahk_id %ControlHwnd%</code>(即使在 <a href="DetectHiddenWindows.htm">DetectHiddenWindows</a> 设置关闭时, 这样也可以操作隐藏控件). 获取控件的 HWND 的一般方法是使用 <a href="ControlGet.htm#Hwnd">ControlGet Hwnd</a>, <a href="MouseGetPos.htm">MouseGetPos</a> 或 <a href="DllCall.htm">DllCall</a>.</p></dd>

  <dt>键</dt>
  <dd><p>要发送的按键序列(请参阅 <a href="Send.htm">Send</a> 命令了解详情). 要发送原义的逗号, 需要对它进行<a href="_EscapeChar.htm">转义</a>(`,). 发送字符的速率由 <a href="SetKeyDelay.htm">SetKeyDelay</a> 决定.</p>
    <p>与 <a href="Send.htm">Send</a> 命令不同, ControlSend 不能发送鼠标点击. 请用 <a href="ControlClick.htm">ControlClick</a> 发送.</p></dd>

  <dt>WinTitle</dt>
  <dd><p>窗口标题或识别目标窗口的其他条件. 请参阅 <a href="../misc/WinTitle.htm">WinTitle</a>.</p></dd>

  <dt>WinText</dt>
  <dd><p>如果使用此参数, 那么它必须是目标窗口中单个文本元素的子字符串(和内置的 Window Spy 工具显示的一样). 当 <a href="DetectHiddenText.htm">DetectHiddenText</a> 的设置为 ON 时, 那么会检测到隐藏文本元素.</p></dd>

  <dt>ExcludeTitle</dt>
  <dd><p>标题中含有此参数值的窗口将被排除.</p></dd>

  <dt>ExcludeText</dt>
  <dd><p>文本中含有此参数值的窗口将被排除.</p></dd>

</dl>

<h2>ErrorLevel</h2>
<p><span class="ver">[v1.1.04+]</span>: 此命令失败时会抛出异常. 想了解更多信息, 请参阅<a href="Catch.htm#RuntimeErrors">运行时错误</a>.</p>
<p>如果遇到问题则 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 被置为 1, 否则为 0.</p>
<h2>备注</h2>
<p>ControlSendRaw 会准确地按照原样发送 <em>Keys</em> 参数中的按键, 而不把 <code>{Enter}</code> 转换成 <kbd>Enter</kbd> 键, 把 <code>^c</code> 转换成 <kbd>Control</kbd>+<kbd>C</kbd>, 等等. 有关详细信息, 请参阅<a href="Send.htm#SendRaw">原始模式</a>. 在 ControlSend 中, 使用 <a href="Send.htm#Raw">{Raw}</a> 或 <a href="Send.htm#Text">{Text}</a> 也是有效的. <span class="ver">[v1.1.27+]:</span> <a href="Send.htm#SendText">文本模式</a>可能更可靠的发送文本.</p>
<p>如果省略 <em>Control</em> 参数, 那么此命令会尝试直接发送到目标窗口的顶层控件(一般这个是正确的), 当目标窗口没有控件时则发送到窗口自身. 这可以用在窗口还不含有任何控件或无所谓发送给哪个控件的时候.</p>
<p>默认情况下, 修饰符键击(<kbd>Control</kbd>, <kbd>Alt</kbd>, <kbd>Shift</kbd> 和 <kbd>Win</kbd>) 的发送方法和在 Send 命令一般模式下发送相同. 这样可以让命令提示符和其他控制台窗口正确检测到大写字母, 控制字符, 等等. 这样也提供了其他方面的可靠性.</p>
<p>然而, 在某些情况下这些修饰符事件可能和活动窗口发生冲突, 尤其是在 ControlSend 发送期间或正发送 <kbd>Alt</kbd> 键的时候用户正在输入(因为 <kbd>Alt</kbd> 会激活活动窗口的菜单栏). 通过明确地发送修饰键的按下和弹起时间可以避免此问题, 例如:</p>
<pre>ControlSend, Edit1, {Alt down}f{Alt up}, Untitled - Notepad</pre>
<p>上面的方法还可以在工作站被锁定(被登录提示保护) 时发送修饰符键击(<kbd>Control</kbd>/<kbd>Alt</kbd>/<kbd>Shift</kbd>/<kbd>Win</kbd>).</p>
<p>使用 ControlSend 发送键击到控制台窗口(例如命令提示符) 时, 应该避免使用 <a href="BlockInput.htm">BlockInput</a>. 因为它可能让大写字符和修饰符按键例如 <kbd>Control</kbd> 工作不正常.</p>
<p><a href="SetKeyDelay.htm">SetKeyDelay</a> 的值决定了发送按键的速度. 如果目标窗口无法可靠地接收到键击, 请尝试在 <a href="SetKeyDelay.htm">SetKeyDelay</a> 的第二个参数中增加按键时长, 例如:</p>
<pre>SetKeyDelay, 10, 10
SetKeyDelay, 0, 10
SetKeyDelay, -1, 0</pre>
<p>如果目标控件是 Edit 控件(或类似的控件), 则使用下列方法通常比 ControlSend 更可靠和快速:</p>
<pre><a href="Control.htm">Control</a>, EditPaste, This text will be inserted at the caret position., ControlName, WinTitle</pre>
<pre><a href="ControlSetText.htm">ControlSetText</a>, ControlName, This text will entirely replace any current text., WinTitle</pre>
<p>ControlSend 通常不能很好的操作窗口的菜单栏. 要变通解决此问题, 请使用 <a href="WinMenuSelectItem.htm">WinMenuSelectItem</a>. 如果由于菜单栏的性质而操作失败, 那么您可以参照<a href="../misc/SendMessage.htm">发送消息指南</a>来尝试找到想要选择的菜单的对应消息.</p>
<p>窗口标题和文本是区分大小写的. 只有在打开 <a href="DetectHiddenWindows.htm">DetectHiddenWindows</a> 设置时, 才能检测到隐藏窗口.</p>
<h2>相关</h2>
<p><a href="SetKeyDelay.htm">SetKeyDelay</a>, <a href="_EscapeChar.htm">转义序列(如 `%)</a>, <a href="Control.htm">Control</a>, <a href="ControlGet.htm">ControlGet</a>, <a href="ControlGetText.htm">ControlGetText</a>, <a href="ControlMove.htm">ControlMove</a>, <a href="ControlGetPos.htm">ControlGetPos</a>, <a href="ControlClick.htm">ControlClick</a>, <a href="ControlSetText.htm">ControlSetText</a>, <a href="ControlFocus.htm">ControlFocus</a>, <a href="Send.htm">Send</a>, <a href="../misc/Winamp.htm">自动化 Winamp</a></p>
<h2>示例</h2>
<pre class="NoIndent">ControlSend, Edit1, This is a line of text in the notepad window., Untitled
SetTitleMatchMode, 2
ControlSend, , abc, cmd.exe  <em>; 直接发送到命令提示符窗口.</em></pre>

</body>
</html>